00001 <?php
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00021
00022
00023
00024 if ( !defined("PATH_TO_ROOT") ) {
00025 define( "PATH_TO_ROOT", "../../../" );
00026 }
00027
00028 require_once (PATH_TO_ROOT."ressourcen/classes/filemanager/class.file.inc.php");
00029 require_once (PATH_TO_ROOT."ressourcen/classes/filemanager/class.folder.inc.php");
00030 require_once (PATH_TO_ROOT."ressourcen/classes/archiver/class.zipvisitor.inc.php");
00031 require_once (PATH_TO_ROOT."ressourcen/classes/archiver/interface.archiveprovider.inc.php");
00032 require_once (PATH_TO_ROOT."ressourcen/classes/archiver/class.archiverexception.inc.php");
00033
00034
00041 class ZipProvider implements ArchiveProvider {
00042 private $folder;
00043 private $recursion;
00044 private $tempFile;
00045
00057 public function __construct(Folder $folder, $recursion = FALSE, $tempFile = null) {
00058 assert(!is_null($folder));
00059 assert($folder instanceof Folder);
00060
00061 global $settings;
00062
00063 $this->folder = $folder;
00064 $this->recursion = $recursion;
00065
00066 if (empty($tempFile)) {
00067 $basedir = PATH_TO_ROOT.$settings["upload_path"];
00068 $basedir .= 'filemanager/courseID/'.$_SESSION['course'];
00069
00070 $tempFile = tempnam($basedir, "archiver");
00071 }
00072
00073 $this->tempFile = $tempFile;
00074 }
00075
00082 public function __destruct() {
00083 if (file_exists($this->tempFile)) {
00084 unlink($this->tempFile);
00085 }
00086 }
00087
00093 public function setRecursion($recursion) {
00094 $this->recursion = $recursion;
00095 }
00096
00102 public function getRecursion() {
00103 return $this->recursion;
00104 }
00105
00111 public function setTempFile($tempFile) {
00112 $this->tempFile = $tempFile;
00113 }
00114
00120 public function getTempFile() {
00121 return $this->tempFile;
00122 }
00123
00129 public function setFolder(Folder $folder) {
00130 $this->folder = $folder;
00131 }
00132
00138 public function getFolder() {
00139 return $this->folder;
00140 }
00141
00147 public function createArchive() {
00148 $zipArchiver = new ZipArchive();
00149 if ($zipArchiver->open($this->tempFile, ZipArchive::OVERWRITE) !== TRUE) {
00150 throw new ArchiverException("Fehler beim Anlegen des Archivs. ".$this->tempFile);
00151 }
00152
00153 $zipVisitor = new ZipVisitor($zipArchiver, $this->recursion);
00154 $this->folder->archiverAccept($zipVisitor);
00155
00156 if ($zipArchiver->status != ZipArchive::ER_OK) {
00157 throw new ArchiverException("Fehler beim Erzeugen des Archivs: ".$zipArchiver->status);
00158 }
00159 $zipArchiver->close();
00160 }
00161
00168 public function sendArchive() {
00169 global $resDB;
00170
00171 if (file_exists($this->tempFile)) {
00172 $filename = $resDB->getCourseShortNameByID($this->folder->getCourseID());
00173 $filename .= "-".$this->folder->getLink().".zip";
00174
00175 $this->logFolderDownload($this->folder);
00176
00177 header("Content-Type: application/zip");
00178 header("Content-Disposition: attachment; filename=\"".$filename."\"");
00179 header("Content-Transfer-Encoding: binary");
00180 header("Content-Length: ".filesize($this->tempFile));
00181
00182 readfile($this->tempFile);
00183 unlink($this->tempFile);
00184 } else {
00185 throw new ArchiverException("Bereitgestelltes Zip Archive konnte nicht gefunden werden.");
00186 }
00187 }
00188
00194 private function logFolderDownload(Folder $folder) {
00195 global $resDB;
00196
00197 $resDB->logResourceDownload($folder->getID());
00198
00199 $files = $folder->getFiles();
00200 foreach ($files as $file) {
00201 $resDB->logResourceDownload($file->getID());
00202 }
00203
00204 if ($this->recursion) {
00205 $subFolders = $folder->getSubFolders();
00206 foreach ($subFolders as $subFolder) {
00207 $this->logFolderDownload($subFolder);
00208 }
00209 }
00210 }
00211
00212
00222 public static function checkArchiveSize(Folder $folder, $recursion) {
00223 global $resDB;
00224
00225 $size = 0;
00226
00227 $files = $folder->getFiles();
00228 foreach ($files as $file) {
00229 $size += $file->getSize();
00230 }
00231
00232 if ($recursion) {
00233 $subFolders = $folder->getSubFolders();
00234 foreach ($subFolders as $subFolder) {
00235 $size += self::checkArchiveSize($subFolder, $recursion);
00236 }
00237 }
00238
00239 return $size;
00240 }
00241 }
00242
00243 ?>